# 词云图生成脚本
import datetime
import os
import re

from openpyxl import load_workbook, Workbook  # excel操作
# 以下都是云图要引入的
import jieba # 分词
from matplotlib import pyplot as plt # 绘图
from wordcloud import wordcloud, WordCloud  # 词云
from PIL import Image  # 图片处理
import numpy as np  # 矩阵运算



# 需要自设的地方已加 ******

# 分词并返回字符串，适用于对一段文字进行的词云图
def splitWord():
    # 读取文字，此处需要指定source内的文件名称 ******
    file = open("source/gansu.txt", encoding="utf-8")
    # print(file.read())
    text = file.read()
    file.close()
    cut = jieba.cut(text) # jieba 分词
    string = ' '.join(cut) # 分词后‘ ’隔开
    return string


# 根据统计数据返回字符串，适用于对已统计完成的数据生成词云图
def excelWord():
    # 读取excel，用准备好的统计数据进行词云图生成
    # 此处需要指定source内文件的名称。xlsx的数据格式需要与示例相同 ******
    data = load_workbook('source/dataExample.xlsx')
    # 数据在第一张表
    table = data.worksheets[0]
    string = ""
    for row in table.rows:
        # 词频
        count =int(row[1].value)
        for i in range(count):
             string += row[0].value+' '
    return string


# 绘制词云图
def paintPic():
    # 生成词云图的方式，True为数据统计方式，False为切词方式 ******
    useDataMethod = False

    # 生成词云图的文本
    text = ""
    if useDataMethod:
        text = excelWord()
    else:
        text = splitWord()
    # 绘图
    # 打开底图，要求白底 ******
    img = Image.open("source/binglinonly.png")
    img_arr = np.array(img)  # 将图片转换为数组
    wc = WordCloud(
        background_color='white', # 生成图片的背景色，建议白色或黑色 ******
        mask=img_arr,
        collocations=False, # 防止关键词重复，True时可能会出现相同的关键词
        font_path="msyh.ttc"  # 字体，微软雅黑。 字体所在位置：C/Windows/Fonts ******
    )
    wc.generate_from_text(text)
    # 绘制图片
    fig=plt.figure(1)
    plt.imshow(wc)
    plt.axis('off') # 是否显示坐标轴
    timeStr=datetime.datetime.now().strftime('%Y%m%d%H%M%S')
    if os.path.exists("result")==False:
        os.mkdir("result")
    # 输出词云图片到文件,dpi为像素，影响清晰度 ******
    plt.savefig("result/result_"+timeStr+".jpg",dpi=1000)

# 切词并输出输出词频
def splitWordCount():
    # 读取文字，此处需要指定source内的文件名称 ******
    file = open("source/gansu.txt", encoding="utf-8")
    # print(file.read())
    text = file.read()
    file.close()
    cut = jieba.cut(text)  # jieba 分词
    # 新建字典，将关键词计数
    vardict=dict()
    if "123" in vardict:
        print(vardict["123"])
    #判断中文的正则表达式
    zhPattern = re.compile(u'[\u4e00-\u9fa5]+')
    for word in cut:
        match = zhPattern.search(word)
        #中文
        if match:
            #长度大于1
            if len(word)>1:
                # 已含键值
                if word in vardict:
                    vardict[word]+=1
                else:
                    vardict[word]=1
    print("总长度：",len(vardict))

    # 创建指定的文件，并将数据输入到指定文件
    wb=Workbook()
    # 激活workbook
    wb.active
    ws1=wb.create_sheet("wordCountData",0)
    ws1['A1']="关键词"
    ws1['B1']="词频"
    # 行数计算器
    line=2
    for d in vardict:
        ws1['A'+str(line)]=d
        ws1['B'+str(line)]=str(vardict[d])
        line+=1
    print("输入行数",line-1)
    timeStr = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
    if os.path.exists("result") == False:
        os.mkdir("result")
    wb.save("result/wordCount_"+timeStr+".xlsx")

# 运行脚本.
if __name__ == '__main__':
    # 生成词云图
    #paintPic()
    # 切词词频统计器
    splitWordCount()
    print("已成功生成！(๑•̀ㅂ•́)و✧")

